﻿
namespace MoneyBook.Web.Services {
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Data;
    using System.Linq;
    using System.ServiceModel.DomainServices.EntityFramework;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using MoneyBook.Web.Models;


    // MoneyBookEntities コンテキストを使用してアプリケーション ロジックを実装します。
    // TODO: これらのメソッドまたは追加のメソッドにアプリケーション ロジックを追加します。
    // TODO: 認証を設定し (Windows/ASP.NET Forms)、次の文字列のコメントを解除して、匿名アクセスを無効にします。
    // 必要に応じ、ロールを追加してアクセスを制限することも検討してください。
    // [RequiresAuthentication]
    [EnableClientAccess()]
    public class ItemService : LinqToEntitiesDomainService<MoneyBookEntities> {

        public IQueryable<Item> GetItems() {
            return this.ObjectContext.Items.OrderBy(i => i.PurchaseDate);
        }

        public Item GetItem(int itemId) {
            return this.ObjectContext.Items.Include("Category").Where(i => i.ItemId == itemId).FirstOrDefault();
        }

        [Query]
        public IQueryable<Item> GetItemsByAccount(int accountId) {
            return (from i in this.ObjectContext.Items.Include("Category")
                   where i.AccountId == accountId
                   select i);
        }

        public void InsertItem(Item item) {
            if ((item.EntityState != EntityState.Detached)) {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(item, EntityState.Added);
            } else {
                this.ObjectContext.Items.AddObject(item);
            }
        }

        public void UpdateItem(Item currentItem) {
            this.ObjectContext.Items.AttachAsModified(currentItem, this.ChangeSet.GetOriginal(currentItem));
        }

        public void DeleteItem(Item item) {
            if ((item.EntityState != EntityState.Detached)) {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(item, EntityState.Deleted);
            } else {
                this.ObjectContext.Items.Attach(item);
                this.ObjectContext.Items.DeleteObject(item);
            }
        }
    }
}


